/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package co.edu.senaclem.aspera.vista;

import co.edu.senaclem.logica.AprendizLogicaLocal;
import co.edu.senaclem.logica.PermisoLogicaLocal;
import co.edu.senaclem.logica.UsuariosLogicaLocal;
import co.edu.senaclem.modelo.Permiso;
import java.io.IOException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import org.joda.time.DateTime;
import org.joda.time.Period;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import org.joda.time.format.PeriodFormatter;
import org.joda.time.format.PeriodFormatterBuilder;
import org.primefaces.component.calendar.Calendar;
import org.primefaces.component.commandbutton.CommandButton;
import org.primefaces.component.inputtext.InputText;
import org.primefaces.component.inputtextarea.InputTextarea;
import org.primefaces.component.selectonemenu.SelectOneMenu;
import org.primefaces.event.SelectEvent;

/**
 *
 * @author DILOVE
 */
@ManagedBean(name = "permisosVista")
@RequestScoped
public class PermisoVista {

    @EJB
    private PermisoLogicaLocal permisoLogica;

    @EJB
    private AprendizLogicaLocal aprendizLogica;

    @EJB
    private UsuariosLogicaLocal usuariosLogica;

    private InputText txtFecha;
    private Calendar txtHoraDesde;
    private Calendar txtHoraHasta;
    private InputTextarea txtMotivo;
    private InputText txtCodigo;
    private SelectOneMenu cmbEstadoPermiso;
    private CommandButton btnRegistrar;
    private CommandButton btnModificar;
    private CommandButton btnEliminar;
    private CommandButton btnLimpiar;
    private Permiso selectedPermiso;
    
    private List<Permiso> listaPermisos = null;
    private String fechaPermiso;
    private String codigoNew;

    public void onEliminacionConfirm(ActionEvent actionEvent) {
        borrar_action();
    }

    /**
     * @return the btnRegistrar
     */
    public CommandButton getBtnRegistrar() {
        return btnRegistrar;
    }

    /**
     * @param btnRegistrar the btnRegistrar to set
     */
    public void setBtnRegistrar(CommandButton btnRegistrar) {
        this.btnRegistrar = btnRegistrar;
    }

    /**
     * @return the btnModificar
     */
    public CommandButton getBtnModificar() {
        return btnModificar;
    }

    /**
     * @param btnModificar the btnModificar to set
     */
    public void setBtnModificar(CommandButton btnModificar) {
        this.btnModificar = btnModificar;
    }

    /**
     * @return the btnEliminar
     */
    public CommandButton getBtnEliminar() {
        return btnEliminar;
    }

    /**
     * @param btnEliminar the btnEliminar to set
     */
    public void setBtnEliminar(CommandButton btnEliminar) {
        this.btnEliminar = btnEliminar;
    }

    /**
     * @return the btnLimpiar
     */
    public CommandButton getBtnLimpiar() {
        return btnLimpiar;
    }

    /**
     * @param btnLimpiar the btnLimpiar to set
     */
    public void setBtnLimpiar(CommandButton btnLimpiar) {
        this.btnLimpiar = btnLimpiar;
    }

    public void registrar_action() {
        //System.out.println("Registrar Permiso");
        if (usuariosLogica.validarSesion()) {
            try {
                Permiso permiso = new Permiso();
                SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
                SimpleDateFormat formath = new SimpleDateFormat("HH:mm");
                Integer codPer = Integer.parseInt(txtCodigo.getValue().toString());
                String fecha = txtFecha.getValue().toString();
                permiso.setCodigo(codPer);
                permiso.setFecha(fecha);
                String h1 = formath.format(txtHoraDesde.getValue());
                String h2 = formath.format(txtHoraHasta.getValue());
                if (compararHoras(h1, h2)) {
                    permiso.setHoraDesde(h1);
                    permiso.setHoraHasta(h2);
                    permiso.setMotivo(txtMotivo.getValue().toString());
                    permiso.setEstado("PENDIENTE");
                    permiso.setDocumentoCoordinador(null);
                    permiso.setDocumentoInstructor(null);
                    String userAprendiz = (String) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("usuario");

                    if (userAprendiz != null) {
                        permiso.setDocumentoAprendiz(aprendizLogica.consultarPorId(Long.parseLong(userAprendiz)));
                        permisoLogica.registrar(permiso);
                        // System.out.println("Si registro???");
                        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Mensaje: ", "El Permiso se Registró con Exito!"));
                    }
                } else {
                    FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error: ", "La Hora de Fin No Puede ser Mayor a la Hora de Inicio!"));
                }

            } catch (NumberFormatException nfe) {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error: ", "El Documento Debe Ser Numérico!"));
            } catch (Exception e) {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error: ", e.getMessage()));
                //System.out.println("excepcion " + e.getMessage());
            }
            listaPermisos = null;
            limpiar_action();
        } else {
            try {
                FacesContext.getCurrentInstance().getExternalContext().redirect("../SesionInvalida.xhtml");
            } catch (IOException ex) {
                Logger.getLogger(CoordinadorVista.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    private static boolean compararHoras(String horaInicial, String horaFinal) {
        try {
            DateFormat dateFormat = new SimpleDateFormat("HH:mm");
            Date horaIni;
            Date horaFin;
            horaIni = dateFormat.parse(horaInicial);
            horaFin = dateFormat.parse(horaFinal);
            if (horaIni.compareTo(horaFin) < 0) {
                //System.out.println("correcta");
                return true;
            } else {
                //System.out.println("incorrecta");
                return false;
            }
        } catch (ParseException ex) {
            //Logger.getLogger(Main2.class.getName()).log(Level.SEVERE, null, ex);
            //System.out.println("Posee errores");
            return false;
        }
    }

    /*public void modificar_action() {
     //System.out.println("Modificar Permiso");
     if (usuariosLogica.validarSesion()) {
     try {            
     Long documentoInstructor = Long.parseLong(txtIdentificacion.getValue().toString());        
     //Modificar
     Instructor instructor=new Instructor();
     instructor.setDocumentoinstructor(documentoInstructor);
     instructor.setNombreinstructor(txtNombre.getValue().toString());
     instructor.setTipoinstructor(cmbTipoInstructor.getValue().toString());            
     instructorLogica.modificar(instructor);
     FacesContext.getCurrentInstance().addMessage("mensaje", new FacesMessage("El instructor se modifico con exito"));
     } catch (Exception e) {
     FacesContext.getCurrentInstance().addMessage("mensaje", new FacesMessage(e.getMessage()));
     }
     listaInstructores=null;
     limpiar_action();
     } else {
     try {
     FacesContext.getCurrentInstance().getExternalContext().redirect("../SesionInvalida.xhtml");
     } catch (IOException ex) {
     Logger.getLogger(CoordinadorVista.class.getName()).log(Level.SEVERE, null, ex);
     }
     }
     }*/
    public void borrar_action() {
        //System.out.println("Borrar Permiso");
        if (usuariosLogica.validarSesion()) {
            try {
                Integer codigoPermiso = Integer.parseInt(txtCodigo.getValue().toString());
                Permiso p = permisoLogica.consultarPorId(codigoPermiso);
                permisoLogica.eliminar(p);

                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Mensaje: ", "El Permiso se Eliminó con Exito"));
            } catch (Exception e) {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error: ", e.getMessage()));
            }
            listaPermisos = null;
            limpiar_action();
        } else {
            try {
                FacesContext.getCurrentInstance().getExternalContext().redirect("../SesionInvalida.xhtml");
            } catch (IOException ex) {
                Logger.getLogger(CoordinadorVista.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    public void limpiar_action() {
        //System.out.println("Limpiar");
        if (usuariosLogica.validarSesion()) {
            txtHoraDesde.setValue(null);
            txtHoraHasta.setValue(null);
            txtFecha.setValue(getFechaPermiso());
            txtCodigo.setValue(getCodigoNew());
            txtMotivo.setValue("");
            cmbEstadoPermiso.setValue("");
            btnRegistrar.setDisabled(false);
            btnEliminar.setDisabled(true);
        } else {
            try {
                FacesContext.getCurrentInstance().getExternalContext().redirect("../SesionInvalida.xhtml");
            } catch (IOException ex) {
                Logger.getLogger(CoordinadorVista.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    /**
     * @return the permisoLogica
     */
    public PermisoLogicaLocal getPermisoLogica() {
        return permisoLogica;
    }

    /**
     * @param permisoLogica the permisoLogica to set
     */
    public void setPermisoLogica(PermisoLogicaLocal permisoLogica) {
        this.permisoLogica = permisoLogica;
    }

    /**
     * @return the txtFecha
     */
    public InputText getTxtFecha() {
        //System.out.println("Va a mostrar la fecha?");
        java.util.Date fecha = new Date();
        //txtFecha.setValue(fecha);
        return txtFecha;
    }

    /**
     * @param txtFecha the txtFecha to set
     */
    public void setTxtFecha(InputText txtFecha) {
        this.txtFecha = txtFecha;
    }

    /**
     * @return the txtMotivo
     */
    public InputTextarea getTxtMotivo() {
        return txtMotivo;
    }

    /**
     * @param txtMotivo the txtMotivo to set
     */
    public void setTxtMotivo(InputTextarea txtMotivo) {
        this.txtMotivo = txtMotivo;
    }

    /**
     * @return the selectedPermiso
     */
    public Permiso getSelectedPermiso() {
        return selectedPermiso;
    }

    /**
     * @param selectedPermiso the selectedPermiso to set
     */
    public void setSelectedPermiso(Permiso selectedPermiso) {
        this.selectedPermiso = selectedPermiso;
    }

    /**
     * @return the listaPermisos
     */
    public List<Permiso> getListaPermisos() {
        if (listaPermisos == null) {
            try {
                String userAprendiz = (String) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("usuario");
                listaPermisos = permisoLogica.consultarPermisosAprendiz(Long.parseLong(userAprendiz));
            } catch (Exception ex) {
                Logger.getLogger(PermisoVista.class.getName()).log(Level.SEVERE, null, ex);
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error: ", ex.getMessage()));
            }
        }
        return listaPermisos;
    }

    /**
     * @return the fechaPermiso
     */
    public String getFechaPermiso() {
        String patron = "yyyy-MM-dd";
        SimpleDateFormat formato = new SimpleDateFormat(patron);
        fechaPermiso = formato.format(new Date());
        return fechaPermiso;
    }

    /**
     * @param fechaPermiso the fechaPermiso to set
     */
    public void setFechaPermiso(String fechaPermiso) {
        this.fechaPermiso = fechaPermiso;
    }

    /**
     * @return the txtHoraDesde
     */
    public Calendar getTxtHoraDesde() {
        return txtHoraDesde;
    }

    /**
     * @param txtHoraDesde the txtHoraDesde to set
     */
    public void setTxtHoraDesde(Calendar txtHoraDesde) {
        this.txtHoraDesde = txtHoraDesde;
    }

    /**
     * @return the txtHoraHasta
     */
    public Calendar getTxtHoraHasta() {
        return txtHoraHasta;
    }

    /**
     * @param txtHoraHasta the txtHoraHasta to set
     */
    public void setTxtHoraHasta(Calendar txtHoraHasta) {
        this.txtHoraHasta = txtHoraHasta;
    }

    /**
     * @param listaPermisos the listaPermisos to set
     */
    public void setListaPermisos(List<Permiso> listaPermisos) {
        this.listaPermisos = listaPermisos;
    }

    public void onRowSelect(SelectEvent event) {
        //System.out.println("Selecciono un Permiso para Eliminar");
        if (usuariosLogica.validarSesion()) {
            try {
                Permiso permiso = (Permiso) event.getObject();
                // System.out.println("Permiso Seleccionado" + permiso.getCodigo());
                txtFecha.setValue(permiso.getFecha().toString());
                txtCodigo.setValue(permiso.getCodigo());
                SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm");
                Date horaD = dateFormat.parse(permiso.getHoraDesde());
                Date horaH = dateFormat.parse(permiso.getHoraHasta());
                txtHoraDesde.setValue(horaD);
                txtHoraHasta.setValue(horaH);
                txtMotivo.setValue(permiso.getMotivo().toString());
                cmbEstadoPermiso.setValue(permiso.getEstado());
                btnRegistrar.setDisabled(true);
                btnEliminar.setDisabled(false);
            } catch (ParseException ex) {
                Logger.getLogger(PermisoVista.class.getName()).log(Level.SEVERE, null, ex);
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error: ", ex.getMessage()));
            }
        } else {
            try {
                FacesContext.getCurrentInstance().getExternalContext().redirect("../SesionInvalida.xhtml");
            } catch (IOException ex) {
                Logger.getLogger(CoordinadorVista.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    /**
     * @return the txtCodigo
     */
    public InputText getTxtCodigo() {
        return txtCodigo;
    }

    /**
     * @param txtCodigo the txtCodigo to set
     */
    public void setTxtCodigo(InputText txtCodigo) {
        this.txtCodigo = txtCodigo;
    }

    /**
     * @return the codigoNew
     */
    public String getCodigoNew() {
        try {
            //System.out.println("Va a calcular el codigo del permiso");
            codigoNew = permisoLogica.generarCodigoPermiso();
            //System.out.println("El codigo del permiso es " + codigoNew);
        } catch (Exception ex) {
            // System.out.println("Error del maximo " + ex.getMessage());
            Logger.getLogger(PermisoVista.class.getName()).log(Level.SEVERE, null, ex);
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error: ", ex.getMessage()));
        }
        return codigoNew;
    }

    /**
     * @param codigoNew the codigoNew to set
     */
    public void setCodigoNew(String codigoNew) {
        this.codigoNew = codigoNew;
    }

    public void validarCalcularHoras() {
        //System.out.println("Va a validar y calcular las horas");
        SimpleDateFormat formath = new SimpleDateFormat("HH:mm");
        String h1 = formath.format(txtHoraDesde.getValue());
        String h2 = formath.format(txtHoraHasta.getValue());
        DateTimeFormatter formatter = DateTimeFormat.forPattern("HH:mm");
        DateTime horaD = formatter.parseDateTime(h1);
        DateTime horaH = formatter.parseDateTime(h2);
        if (compararHoras(h1, h2)) {
            Period period = new Period(horaH, horaD);
            PeriodFormatter tiempo = new PeriodFormatterBuilder()
                    .appendHours().appendSuffix(" hours, ")
                    .appendMinutes().appendSuffix(" minutes, ")
                    .printZeroNever()
                    .toFormatter();
            String elapsed = tiempo.print(period);
            //System.out.println("Hay tantas horas" + elapsed + "");
        } else {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error: ", "La Hora de Fin No Puede ser Mayor a la Hora de Inicio!"));
        }
    }

    /**
     * @return the cmbEstadoPermiso
     */
    public SelectOneMenu getCmbEstadoPermiso() {
        return cmbEstadoPermiso;
    }

    /**
     * @param cmbEstadoPermiso the cmbEstadoPermiso to set
     */
    public void setCmbEstadoPermiso(SelectOneMenu cmbEstadoPermiso) {
        this.cmbEstadoPermiso = cmbEstadoPermiso;
    }
}
